#include <stdio.h>
#include <event.h>
#include "wrap.h"

/**
 * client_fd 回调
 * @param client_fd
 * @param events
 * @param arg
 */
void client_fd_callback(int client_fd,short events,void * arg){
    char buff[1500] = "";
    int n = Read(client_fd,buff, sizeof(buff));
    if(n <= 0){
        perror("err or close");
        //下树 不下树会有问题出现
        //event_del()
    }
    else{
        printf("%s",buff);
        write(client_fd,buff,n);
    }
}

/**
 * socket_fd 回调
 * @param socket_fd
 * @param events
 * @param arg
 */
void socket_fd_callback(int socket_fd,short events,void * arg){
    struct event_base * base = (struct event_base *)arg;
    int client_fd = Accept(socket_fd,NULL,NULL);
    // client_fd 上树
    struct event * ev = event_new(base,client_fd,EV_READ | EV_PERSIST,client_fd_callback,NULL);
    event_add(ev,NULL);
}

/**
 * libevent 使用
 *      创建 event_base 根节点
 *      初始化上树节点
 *      节点上树
 *      节点下树
 *      删除节点
 *      释放 event_base 根节点
 *
 *      gcc main.c wrap.c -levent
 *
 *      该代码有问题，最好时创建一个数组来存放指定的 event 用来给 client_fd 去删除指定的数据
 * @return
 */
int main()
{

    //创建套接字
    int socket_fd = tcp4bind(8080,NULL);
    //监听
    Listen(socket_fd,128);
    //创建 event_base 根节点
    struct event_base * base = event_base_new();
    //初始化 socket_fd 节点    读 位或 持续
    struct event * ev = event_new(base,socket_fd,EV_READ | EV_PERSIST,socket_fd_callback,base);
    //上树
    event_add(ev,NULL);
    //循环监听 阻塞的
    event_base_dispatch(base);
    //收尾
    close(socket_fd);
    event_base_free(base);

    return 0;
}
